from django import forms
# 导入app01的models包
from app01 import models
# 导入正则表达式包，校验方法一
from django.core.validators import RegexValidator
# 导入钩子校正方法，校验方法二
from django.core.exceptions import ValidationError
from app01.utils.bootstrap import BootStrapModelForm


class UserModelForm(BootStrapModelForm):
    name = forms.CharField(
        min_length=2,
        label="用户名",
        widget=forms.TextInput(attrs={"class": "form-control"})
    )

    class Meta:
        model = models.UserInfo
        fields = ["name","password","age","account","gender","create_time","depart"]
    # 已继承BootStrapModelForm类，下面的代码不用写了。继承bootstrap样式
    # def __init__(self, *args, **kwargs):
    #     super().__init__(*args, **kwargs)
    #     # 循环ModelForm中的所有字段，给每个字段做widget插件，添加了class="form-control"
    #     for name,field in self.fields.items():
    #         # 加"placeholder": field.label，输入框显示提示信息
    #         field.widget.attrs = {"class": "form-control","placeholder": field.label}

class PrettyModelForm(BootStrapModelForm):
    # 校验POST信息 方法一：
    mobile = forms.CharField(
        label='号码',
        # 正则表达式
        validators=[RegexValidator(r'^1\d{10}$','号码格式错误')]
    )
    class Meta:
        model = models.PrettyNum
        fields = ["mobile",'price','level','status']
        # 另外两种写法
        # fields = "__all__" 表示全部字段
        # fields = ['level'] 表示除了level的所有字段

    # # 继承bootstrap样式
    # def __init__(self, *args, **kwargs):
    #     super().__init__(*args, **kwargs)
    #     # 循环找到widget插件，添加了class="form-control"
    #     for name, field in self.fields.items():
    #         # 加"placeholder": field.label，输入框显示提示信息
    #         field.widget.attrs = {"class": "form-control","placeholder": field.label}

    #校验POST信息 方法二：钩子方法，前提已经有这个字段了，Djongo会自动生成clean_XXX
    def clean_mobile(self):
        txt_mobile = self.cleaned_data['mobile']
        # exists方法，在数据中搜索有没有重复的号码，正则不能数据库搜索，所以要用钩子方法
        exists = models.PrettyNum.objects.filter(mobile=txt_mobile).exists()
        # 号码已存在的钩子方法，在添加页面使用，但是在编辑页面不能用
        if exists:
            raise ValidationError("号码已存在")
        # 验证通过，用户输入的值返回
        return txt_mobile

class PrettyEditModelForm(BootStrapModelForm):
    # 号码不可修改
    # mobile = forms.CharField(disabled=True,label="手机号")
    # 校验POST信息 方法一：
    mobile = forms.CharField(disabled=True,
        label='号码',
        # 正则表达式
        validators=[RegexValidator(r'^1\d{10}$','号码格式错误')]
    )
    class Meta:
        model = models.PrettyNum
        fields = ['mobile','price','level','status']
        # 另外两种写法
        # fields = "__all__" 表示全部字段
        # fields = ['level'] 表示除了level的所有字段

    # 继承bootstrap样式
    # def __init__(self, *args, **kwargs):
    #     super().__init__(*args, **kwargs)
    #     # 循环找到widget插件，添加了class="form-control"
    #     for name, field in self.fields.items():
    #         # 加"placeholder": field.label，输入框显示提示信息
    #         field.widget.attrs = {"class": "form-control","placeholder": field.label}

    # 校验POST信息 方法二：钩子方法，前提已经有这个字段了，Djongo会自动生成clean_XXX
    def clean_mobile(self):
        txt_mobile = self.cleaned_data['mobile']
        # exists方法，在数据中搜索有没有重复的号码，正则不能数据库搜索，所以要用钩子方法
        # 所以这里要加一个排除自己的方法exclude()，获取当前自己的id方法：self.instance.pk
        exists = models.PrettyNum.objects.exclude(id=self.instance.pk).filter(mobile=txt_mobile).exists()
        # 号码已存在的钩子方法，在添加页面使用，但是在编辑页面不能用
        if exists:
            raise ValidationError("号码已存在")
        # 验证通过，用户输入的值返回
        return txt_mobile